package chaoyue.study.reflect;

import java.lang.reflect.Field;

/**
 * 通过反射机制访问一个java对象的属性
 * 给属性赋值（即使是通过反射机制来给对象赋值，基本的三要素还是没有变）
 * 1.需要确定给那个对象赋值
 * 2.需要给对象的哪个属性赋值
 * 3.需要赋什么值
 * 获取属性的值（两要素）
 * 1.获取哪个对象的值
 * 2.获取对象哪个属性的值
 * 反射机制可以突破修饰符的限制，private的值也可以获取，给框架的设计带来了可能
 */
public class Test07 {
    public static void main(String[] args) throws Exception {
        Class clazz = Class.forName("chaoyue.study.reflect.bean.Student");
        // 先实例化对象
        Object o = clazz.newInstance();
        // 获取需要操作的属性
        Field noFiled = clazz.getField("no");
        // 给o这个对象的no属性赋值
        noFiled.set(o, 10);
        // 获取o这个对象的no属性的值
        System.out.println(noFiled.get(o));
        // 获取私有属性的值
        Field nameFiled = clazz.getDeclaredField("name");
        // 需要手动打破封装，才可以给私有属性赋值
        nameFiled.setAccessible(true);
        nameFiled.set(o, "chaoyue");
        System.out.println(nameFiled.get(o));
    }
}
